最近实习开始算期权隐含波动率。期权隐含波动率的算法写的人不多,分享几种计算方法。
1. 根据BS公式用二分法计算
从WIND里面取数之后算会出现的实际问题是有些价格的期权并没有价格(没人买),所以显示p=0。
def BSM(F0,k,T,r,sigma):
d1=(np.log(F0/k)+(r+0.5*sigma**2)*T)/sigma/np.sqrt(T)
d2=d1-sigma*np.sqrt(T)
c=F0*norm.cdf(d1)-k*np.exp(-r*T)*norm.cdf(d2)
p=k*np.exp(-r*T)*norm.cdf(-d2)-F0*norm.cdf(-d1)
return c,p
#二分法求隐含波动率
def bisection(P,F0,k,r,T,c): #c=0,call;c=1,put.
value0=0#迭代初始值
top=100
floor=0
sigma=(floor+top)/2
i=0
while abs(P-value0)>1e-2:
value0=BSM(F0,k,T,r,sigma)[c]
if (P-value0)>0:
floor=sigma
sigma=(sigma+top)/2
else:
top=sigma
sigma=(sigma+floor)/2
#print(sigma)
i+=1
if i>100:
sigma=''
print('Too many iterations')